package com.winshare.saleAssistant.service.impl;

import com.winshare.saleAssistant.dao.ProductCategoryMapper;
import com.winshare.saleAssistant.domain.entity.ProductCategoryDO;
import com.winshare.saleAssistant.domain.query.ProductCategoryQuery;
import com.winshare.saleAssistant.domain.dto.req.*;
import com.winshare.saleAssistant.domain.dto.resp.ProductCategoryRespDTO;
import com.winshare.saleAssistant.exception.BusinessException;
import com.winshare.saleAssistant.mapper.ProductCategoryMapStruct;
import com.winshare.saleAssistant.service.ProductCategoryService;
import com.winshare.saleAssistant.util.Page;
import com.winshare.saleAssistant.util.RequestHolder;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class ProductCategoryServiceImpl implements ProductCategoryService {

    private final ProductCategoryMapper productCategoryMapper;

    public ProductCategoryServiceImpl(ProductCategoryMapper productCategoryMapper) {
        this.productCategoryMapper = productCategoryMapper;
    }

    @Override
    public void saveProductCategory(ProductCategoryCreateDTO productCategoryCreateDTO) {
        ProductCategoryDO productCategoryDO = ProductCategoryMapStruct.INSTANCE
                .fromProductCategoryCreateDTO(productCategoryCreateDTO);
        if(checkProductCategoryNameExist(productCategoryDO)) {
            throw new BusinessException("系统中已存在相同名称的分类");
        }
        productCategoryDO.setCreator(RequestHolder.getCurrentUser().getStaffName());
        productCategoryMapper.saveProductCategory(productCategoryDO);
    }

    @Override
    public void updateProductCategory(ProductCategoryUpdateDTO productCategoryUpdateDTO) {
        ProductCategoryDO productCategoryDO = ProductCategoryMapStruct.INSTANCE
                .fromProductCategoryUpdateDTO(productCategoryUpdateDTO);
        if(checkProductCategoryNameExist(productCategoryDO)) {
            throw new BusinessException("系统中已存在相同名称的分类");
        }
        productCategoryMapper.updateProductCategory(productCategoryDO);
    }

    @Override
    public void deleteProductCategory(ProductCategoryIdDTO productCategoryIdDTO) {
        ProductCategoryDO productCategoryDO = ProductCategoryMapStruct.INSTANCE
                .fromProductCategoryIdDTO(productCategoryIdDTO);
        if(checkProductByProductCategory(productCategoryDO)) {
            throw new BusinessException("该分类下面还存在产品,故不能删除");
        }
        productCategoryMapper.deleteProductCategory(productCategoryDO);
    }


    @Override
    public Page<ProductCategoryRespDTO> getProductCategoryList(ProductCategoryQueryDTO productCategoryQueryDTO) {
        ProductCategoryQuery productCategoryQuery = ProductCategoryMapStruct.INSTANCE
                .fromProductCategoryQueryDTO(productCategoryQueryDTO);
        productCategoryQuery.setOffsetIndex(productCategoryQueryDTO.getOffsetIndex());
        int totalCount = productCategoryMapper.queryProductCategoryCount(productCategoryQuery);
        Integer pageIndex = productCategoryQueryDTO.getPageIndex();
        Integer pageSize = productCategoryQueryDTO.getPageSize();
        if(0 == totalCount) {
            return new Page<>(pageIndex,pageSize,totalCount,new ArrayList<>());
        }
        List<ProductCategoryDO> productCategoryDOList =
                productCategoryMapper.findProductCategoryListByConditions(productCategoryQuery);
        List<ProductCategoryRespDTO> productCategoryRespDTOList = ProductCategoryMapStruct.INSTANCE
                .fromProductCategoryDOList(productCategoryDOList);
        return new Page<>(pageIndex,pageSize,totalCount,productCategoryRespDTOList);
    }

    @Override
    public void updateProductCategorySort(ProductCategorySortDTO productCategoryMoveDTO) {
        ProductCategoryDO productCategoryDO = ProductCategoryMapStruct.INSTANCE
                .fromProductCategoryMoveDTO(productCategoryMoveDTO);
        productCategoryMapper.updateProductCategory(productCategoryDO);
    }

    @Override
    public ProductCategoryRespDTO getProductCategoryDetail(BaseIdDTO baseIdDTO) {
        ProductCategoryDO productCategoryDO = ProductCategoryMapStruct.INSTANCE.fromBaseIdDTO(baseIdDTO);
        ProductCategoryDO productCategoryDOInSql = productCategoryMapper.getProductCategory(productCategoryDO);
        if(null == productCategoryDOInSql) {
            throw new BusinessException("当前产品分类不存在");
        }
        ProductCategoryRespDTO productCategoryRespDTO = ProductCategoryMapStruct.INSTANCE
                .fromProductCategoryDO(productCategoryDOInSql);
        return productCategoryRespDTO;
    }

    private boolean checkProductCategoryNameExist(ProductCategoryDO productCategoryDO) {
        return productCategoryMapper.countByCategoryName(productCategoryDO) > 0;
    }

    private boolean checkProductByProductCategory(ProductCategoryDO productCategoryDO) {
        return productCategoryMapper.checkProductByProductCategory(productCategoryDO) > 0;
    }
}
